{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ./data/\n",
    "#### BX-Book-Ratings.csv     df_rating\n",
    "#### BX-Books.csv   \n",
    "#### BX-Users.csv    df_user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 分析用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns=['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "278858"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# value_counts()是Series拥有的方法，一般在DataFrame中使用时，需要指定对哪一列或行使用\n",
    "# value_counts()查看location中有哪些不同的值，并计算每个值有多少个重复值\n",
    "location_value_counts = df_user['location'].value_counts() \n",
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "london, england, united kingdom       2506\n",
       "toronto, ontario, canada              2250\n",
       "sydney, new south wales, australia    1744\n",
       "melbourne, victoria, australia        1708\n",
       "portland, oregon, usa                 1629\n",
       "                                      ... \n",
       "issy les moulineaux, n/a, france         1\n",
       "bolivar, new york, usa                   1\n",
       "peachland, north carolina, usa           1\n",
       "perry, michigan, usa                     1\n",
       "pepperell, ,                             1\n",
       "Name: location, Length: 57339, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 平均每个地区,存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum()/location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 把location变成国家(平均每个地区人太少,扩大地区范围)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location   age\n",
       "0        1             usa   NaN\n",
       "1        2             usa  18.0\n",
       "2        3          russia   NaN\n",
       "3        4        portugal  17.0\n",
       "4        5  united kingdom   NaN"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               139711\n",
       "canada             21658\n",
       "united kingdom     18538\n",
       "germany            17043\n",
       "spain              13147\n",
       "                   ...  \n",
       "bfe                    1\n",
       "citrus.                1\n",
       "hamilton               1\n",
       "slo                    1\n",
       "der                    1\n",
       "Name: location, Length: 709, dtype: int64"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAD4CAYAAAAZ1BptAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAbCklEQVR4nO3df5BV9Znn8feHbpofKgLaGofGATckO2qyE9KLZLLrpGREdCxxqnQLK7VSs2xRY8xusj8qwcpWqE3ibjK7M2atMs4wwgRTGdFxMiObxSEU6mZ3S9H2t0iUFjPSQaUVRIMKgs/+cZ/b93B/dEM3t/sin1fVrXvOc77nnudSTX/6fO+59yoiMDMzq2fcWDdgZmatyyFhZmYNOSTMzKwhh4SZmTXkkDAzs4bax7qB4+3MM8+MWbNmjXUbZmYnlMcff/yNiOisrn/kQmLWrFn09PSMdRtmZicUSf9Qr+7pJjMza8ghYWZmDTkkzMysIYeEmZk15JAwM7OGhgwJSWsk7Zb0XJ1t/1FSSDoz1yXpVkm9kp6RNLcwdqmk7XlbWqh/VtKzuc+tkpT16ZI25fhNkqYdn6dsZmZH62jOJH4ILKouSpoJXAq8UihfDszJ23Lg9hw7HVgJXATMA1YWfunfnmPL+5WPtQLYHBFzgM25bmZmo2jIkIiInwN76my6BfgaUPys8cXAnVHyCDBV0jnAZcCmiNgTEXuBTcCi3DYlIh6O0meW3wlcXXistbm8tlBvis3bXucHD/U28xBmZiecYb0mIekq4FcR8XTVphnAzsJ6X9YGq/fVqQOcHRGvAuT9WYP0s1xSj6Se/v7+YTwjeOiFfu74Py8Pa18zs4+qYw4JSZOBbwDfrLe5Ti2GUT8mEbEqIrojoruzs+Zd5cfyOMPe18zso2g4ZxL/CJgNPC3pl0AX8ISkj1E6E5hZGNsF7Bqi3lWnDvB6TkeR97uH0etRk4aRTmZmH3HHHBIR8WxEnBURsyJiFqVf9HMj4jVgPXB9XuU0H9iXU0UbgYWSpuUL1guBjbntHUnz86qm64H78lDrgfJVUEsL9aaod0pjZnayO5pLYO8CHgY+KalP0rJBhm8AdgC9wF8AXwKIiD3At4HH8vatrAHcANyR+7wE3J/17wKXStpO6Sqq7x7bUzt2nm0yMzvSkJ8CGxHXDbF9VmE5gBsbjFsDrKlT7wEurFN/E1gwVH/HiyS/JmFmVsXvuDYzs4YcEgU+jzAzO5JDIkk4JczMqjgkknx9k5lZDYdEgU8kzMyO5JBIkt9xbWZWzSGRPNlkZlbLIVHg8wgzsyM5JFJpummsuzAzay0OiZRfiGdmZgUOiYLwhJOZ2REcEkl4usnMrJpDosyzTWZmNRwSBT6RMDM7kkMiCX81nZlZNYdE8sVNZma1HBIFvrrJzOxIDonkq5vMzGo5JJKnm8zMag0ZEpLWSNot6blC7b9J+oWkZyT9raSphW03SeqV9IKkywr1RVnrlbSiUJ8taYuk7ZLultSR9Qm53pvbZx2vJ92ITyTMzI50NGcSPwQWVdU2ARdGxKeBF4GbACSdDywBLsh9fiCpTVIbcBtwOXA+cF2OBfgecEtEzAH2AsuyvgzYGxEfB27JcU0j5I8KNzOrMmRIRMTPgT1VtZ9FxKFcfQToyuXFwLqIOBARLwO9wLy89UbEjog4CKwDFqv0gUmXAPfm/muBqwuPtTaX7wUWqIkfsOTpJjOzWsfjNYl/BdyfyzOAnYVtfVlrVD8DeKsQOOX6EY+V2/fl+BqSlkvqkdTT398/7Cfi8wgzsyONKCQkfQM4BPy4XKozLIZRH+yxaosRqyKiOyK6Ozs7B2+6AV/dZGZWq324O0paClwJLIjKZH4fMLMwrAvYlcv16m8AUyW159lCcXz5sfoktQOnUzXtZWZmzTWsMwlJi4CvA1dFxLuFTeuBJXll0mxgDvAo8BgwJ69k6qD04vb6DJcHgWty/6XAfYXHWprL1wAPRDNfWfaLEmZmNYY8k5B0F/AF4ExJfcBKSlczTQA25WvJj0TEH0XEVkn3AM9Tmoa6MSIO5+N8GdgItAFrImJrHuLrwDpJ3wGeBFZnfTXwI0m9lM4glhyH59v4eTbzwc3MTlBDhkREXFenvLpOrTz+ZuDmOvUNwIY69R2Urn6qrr8PXDtUf8dbRPhb6szMkt9xncq54BevzcwqHBJJnnAyM6vhkKjiEwkzswqHRKpMNzkmzMzKHBLJk01mZrUcElV8HmFmVuGQSL66ycyslkMi+b0RZma1HBJV/D3XZmYVDokqnm4yM6twSCTPNpmZ1XJImJlZQw6JVP5YDk83mZlVOCSSp5vMzGo5JKr46iYzswqHRCqfSHi6ycyswiGRPN1kZlbLIVHFJxJmZhUOiVS5uskxYWZWNmRISFojabek5wq16ZI2Sdqe99OyLkm3SuqV9IykuYV9lub47ZKWFuqflfRs7nOr8kOUGh2jWTzdZGZW62jOJH4ILKqqrQA2R8QcYHOuA1wOzMnbcuB2KP3CB1YCFwHzgJWFX/q359jyfouGOEZT+TzCzKxiyJCIiJ8De6rKi4G1ubwWuLpQvzNKHgGmSjoHuAzYFBF7ImIvsAlYlNumRMTDUZrnubPqseodo6k822RmVjHc1yTOjohXAfL+rKzPAHYWxvVlbbB6X536YMeoIWm5pB5JPf39/cN6Qv6ocDOzWsf7het6v2ljGPVjEhGrIqI7Iro7OzuPdfcRHt3M7KNruCHxek4Vkfe7s94HzCyM6wJ2DVHvqlMf7BhNMfBmOqeEmdmA4YbEeqB8hdJS4L5C/fq8ymk+sC+nijYCCyVNyxesFwIbc9s7kubnVU3XVz1WvWM0hWebzMxqtQ81QNJdwBeAMyX1UbpK6bvAPZKWAa8A1+bwDcAVQC/wLvCHABGxR9K3gcdy3Lciovxi+A2UrqCaBNyfNwY5RlP5hWszs4ohQyIirmuwaUGdsQHc2OBx1gBr6tR7gAvr1N+sd4xm8YmEmVktv+O6ik8kzMwqHBKpfAmsP5bDzKzCIZH8wrWZWS2HRBWfR5iZVTgkkr90yMyslkOizPNNZmY1HBJV/I5rM7MKh0QaOI9wRpiZDXBIJM82mZnVckhU8YmEmVmFQyJVvuN6jBsxM2shDonk6SYzs1oOiSq+usnMrMIhkfxmOjOzWg6J5OkmM7NaDokqPpEwM6twSKTK1U2OCTOzModEmaebzMxqOCSq+ETCzKzCIZF8ImFmVmtEISHp30naKuk5SXdJmihptqQtkrZLultSR46dkOu9uX1W4XFuyvoLki4r1BdlrVfSipH0ehTPpZkPb2Z2Qhp2SEiaAfxboDsiLgTagCXA94BbImIOsBdYlrssA/ZGxMeBW3Icks7P/S4AFgE/kNQmqQ24DbgcOB+4Lsc2laebzMwqRjrd1A5MktQOTAZeBS4B7s3ta4Grc3lxrpPbF6j05/tiYF1EHIiIl4FeYF7eeiNiR0QcBNbl2KYYeDOdL4I1Mxsw7JCIiF8B/x14hVI47AMeB96KiEM5rA+YkcszgJ2576Ecf0axXrVPo3oNScsl9Ujq6e/vH9bz8WyTmVmtkUw3TaP0l/1s4DeAUyhNDVUr/2le79dwDKNeW4xYFRHdEdHd2dk5VOuD8nSTmVnFSKabfg94OSL6I+ID4CfA7wBTc/oJoAvYlct9wEyA3H46sKdYr9qnUb0pymcSzggzs4qRhMQrwHxJk/O1hQXA88CDwDU5ZilwXy6vz3Vy+wNRenvzemBJXv00G5gDPAo8BszJq6U6KL24vX4E/Q5KvgjWzKxG+9BD6ouILZLuBZ4ADgFPAquA/wWsk/SdrK3OXVYDP5LUS+kMYkk+zlZJ91AKmEPAjRFxGEDSl4GNlK6cWhMRW4fb7zE8r2YfwszshDHskACIiJXAyqryDkpXJlWPfR+4tsHj3AzcXKe+Adgwkh6PlqebzMxq+R3XZmbWkEOiimebzMwqHBLJH8thZlbLIVHDpxJmZmUOieTvuDYzq+WQSJ5tMjOr5ZCo4hMJM7MKh0SqfMf1GDdiZtZCHBLJ001mZrUcElX8fRJmZhUOieSrm8zMajkkkqebzMxqOSSq+EzCzKzCITEgr27yaxJmZgMcEsnTTWZmtRwSVTzdZGZW4ZBIPpEwM6vlkEj+qHAzs1oOiSqebjIzqxhRSEiaKuleSb+QtE3S5yRNl7RJ0va8n5ZjJelWSb2SnpE0t/A4S3P8dklLC/XPSno297lVTfxzf+DNdL66ycxswEjPJP4H8PcR8Y+BfwJsA1YAmyNiDrA51wEuB+bkbTlwO4Ck6cBK4CJgHrCyHCw5Znlhv0Uj7LchzzaZmdUadkhImgJcDKwGiIiDEfEWsBhYm8PWAlfn8mLgzih5BJgq6RzgMmBTROyJiL3AJmBRbpsSEQ9HRAB3Fh6raTzdZGZWMZIzifOAfuAvJT0p6Q5JpwBnR8SrAHl/Vo6fAews7N+XtcHqfXXqNSQtl9Qjqae/v39YT6Z8JuGMMDOrGElItANzgdsj4jPAfipTS/XUm9CJYdRrixGrIqI7Iro7OzsH77phc55vMjOrNpKQ6AP6ImJLrt9LKTRez6ki8n53YfzMwv5dwK4h6l116k0Vnm8yMxsw7JCIiNeAnZI+maUFwPPAeqB8hdJS4L5cXg9cn1c5zQf25XTURmChpGn5gvVCYGNue0fS/Lyq6frCYx1/nm4yM6vRPsL9/w3wY0kdwA7gDykFzz2SlgGvANfm2A3AFUAv8G6OJSL2SPo28FiO+1ZE7MnlG4AfApOA+/PWFJ5sMjOrNaKQiIingO46mxbUGRvAjQ0eZw2wpk69B7hwJD0eK882mZlV+B3XqfI+PaeEmVmZQyJ5usnMrJZDooqnm8zMKhwSyR/LYWZWyyFRxScSZmYVDolUfse1p5vMzCocEsnTTWZmtRwSVfyxHGZmFQ6J5HdJmJnVckiUebrJzKyGQ6KKZ5vMzCocEmng6iZPOJmZDXBIJF/dZGZWyyFRzScSZmYDHBLJVzeZmdVySCR5vsnMrIZDooqvbjIzq3BIJA18x7VTwsyszCGRPNlkZlZrxCEhqU3Sk5J+muuzJW2RtF3S3ZI6sj4h13tz+6zCY9yU9RckXVaoL8par6QVI+31aHi6ycys4nicSXwF2FZY/x5wS0TMAfYCy7K+DNgbER8HbslxSDofWAJcACwCfpDB0wbcBlwOnA9cl2ObojLdZGZmZSMKCUldwO8Dd+S6gEuAe3PIWuDqXF6c6+T2BTl+MbAuIg5ExMtALzAvb70RsSMiDgLrcmyTeMLJzKzaSM8kvg98Dfgw188A3oqIQ7neB8zI5RnAToDcvi/HD9Sr9mlUryFpuaQeST39/f0jekL+qHAzs4phh4SkK4HdEfF4sVxnaAyx7VjrtcWIVRHRHRHdnZ2dg3TdmKebzMxqtY9g388DV0m6ApgITKF0ZjFVUnueLXQBu3J8HzAT6JPUDpwO7CnUy4r7NKofd55sMjOrNewziYi4KSK6ImIWpReeH4iILwIPAtfksKXAfbm8PtfJ7Q9EaW5nPbAkr36aDcwBHgUeA+bk1VIdeYz1w+336J9Y049gZnbCGMmZRCNfB9ZJ+g7wJLA666uBH0nqpXQGsQQgIrZKugd4HjgE3BgRhwEkfRnYCLQBayJiaxP6JY8F+M10ZmZFxyUkIuIh4KFc3kHpyqTqMe8D1zbY/2bg5jr1DcCG49HjUDzdZGZWy++4ruKLm8zMKhwSaeDqJoeEmdkAh0SSJ5zMzGo4JKr4RMLMrMIhkSrTTY4JM7Myh4SZmTXkkKji8wgzswqHRPJXXJuZ1XJIVPFLEmZmFQ6JVLkE1ilhZlbmkEiebjIzq+WQqOLpJjOzCodE8pcOmZnVckgkfyyHmVkth0QVTzeZmVU4JFJluskpYWZW5pBInmwyM6vlkKji6SYzswqHRPLVTWZmtYYdEpJmSnpQ0jZJWyV9JevTJW2StD3vp2Vdkm6V1CvpGUlzC4+1NMdvl7S0UP+spGdzn1ulZr7lzRNOZmbVRnImcQj4DxHxW8B84EZJ5wMrgM0RMQfYnOsAlwNz8rYcuB1KoQKsBC4C5gEry8GSY5YX9ls0gn4H1dFW+qc48MHhZh3CzOyEM+yQiIhXI+KJXH4H2AbMABYDa3PYWuDqXF4M3BkljwBTJZ0DXAZsiog9EbEX2AQsym1TIuLhKH0T0J2FxzruOk+bAED/rw806xBmZiec4/KahKRZwGeALcDZEfEqlIIEOCuHzQB2Fnbry9pg9b469aaY1NHGaRPa2f22Q8LMrGzEISHpVOBvgK9GxNuDDa1Ti2HU6/WwXFKPpJ7+/v6hWm6oc8oE+t9xSJiZlY0oJCSNpxQQP46In2T59ZwqIu93Z70PmFnYvQvYNUS9q069RkSsiojuiOju7Owc9vM5+7SJvLrvvWHvb2b2UTOSq5sErAa2RcSfFjatB8pXKC0F7ivUr8+rnOYD+3I6aiOwUNK0fMF6IbAxt70jaX4e6/rCYzXFJ84+lRdee4cPP/SFsGZmMLIzic8D/xK4RNJTebsC+C5wqaTtwKW5DrAB2AH0An8BfAkgIvYA3wYey9u3sgZwA3BH7vMScP8I+h3Sp7qmsv/gYXa8sb+ZhzEzO2G0D3fHiPi/NH5zwYI64wO4scFjrQHW1Kn3ABcOt8djNXPaJABe2/c+Hz/r1NE6rJlZy/I7rgumn9IBwJ53D45xJ2ZmrcEhUTAtQ2LvfoeEmRk4JI4wddJ4APb6TMLMDHBIHKG9bRynTxrvMwkzs+SQqHL2lAns3Ov3SpiZgUOixqe7pvLUzrcIf7GEmZlDoto/n3Mme/Yf5GfPvz7WrZiZjTmHRJUrP/0btI8Tz/S9NdatmJmNOYdElbZxYnJHG/sP+HslzMwcEnVM7mjnvYMOCTMzh0Qdkye0sf/gobFuw8xszDkk6pjc0ca7PpMwM3NI1DO5o513fSZhZuaQqOcUn0mYmQEOibpKZxIOCTMzh0QdkzvaePeAp5vMzBwSdZw+aTxv7j/IwUMfjnUrZmZjyiFRR/es6Rw49CF//r9f4tBhB4WZnbwcEnVc/IkzmXvuVP5k04t8c/3WsW7HzGzMOCTqmNzRzl//0e/wqRmn8z+f2sWBQ34R28xOTi0fEpIWSXpBUq+kFaN13LZx4l/805m8c+AQv/vHD/Ff79/G3z/3Grvfed8fI25mJ432sW5gMJLagNuAS4E+4DFJ6yPi+dE4/hfnncvZp03grx59hVU/30E5GyaOH8esM07h9z91DmefPpEpE8czuaONyR1tTBzfxqTy/fg2Jo4fxzgpn08+L6rXQeUxeeyBbeUFM7Mx0NIhAcwDeiNiB4CkdcBiYFRCYtw4sfCCj7Hwgo/x9vsf8NQrb/FS/6/51d732Pj8a/zJphdHo40jHFWwUBhUtb1eQFHnsah3nCH2UWHn2rFH9tbosY7YdhT71Ou3+vHMThb/5Q8+xbzZ04/rY7Z6SMwAdhbW+4CLqgdJWg4sBzj33HOb0siUieO5+BOdXPyJTgD+05Xn8+7BQ7z564O8/f4HvHfwMPsPHub9Dyq39w4e5v1DH/JhBNUzVOUpqwiIgVreE1XrRw6IoxhbvZ0jjnN0+xR7jsKxh+q1sl/VtqPYp9jvkcerPX6jbRT6NjuZnDKh7bg/ZquHRL0/B2t+BUTEKmAVQHd396j9ipjc0c7k6a3+T2hmNnyt/sJ1HzCzsN4F7BqjXszMTjqtHhKPAXMkzZbUASwB1o9xT2ZmJ42WniuJiEOSvgxsBNqANRHhd7eZmY2Slg4JgIjYAGwY6z7MzE5GrT7dZGZmY8ghYWZmDTkkzMysIYeEmZk1pI/ah9VJ6gf+YZi7nwm8cRzbaSb32hzutTnca3Mcz15/MyI6q4sfuZAYCUk9EdE91n0cDffaHO61Odxrc4xGr55uMjOzhhwSZmbWkEPiSKvGuoFj4F6bw702h3ttjqb36tckzMysIZ9JmJlZQw4JMzNryCGRJC2S9IKkXkkrWqCfNZJ2S3quUJsuaZOk7Xk/LeuSdGv2/oykuaPY50xJD0raJmmrpK+0cK8TJT0q6ens9T9nfbakLdnr3fmx9EiakOu9uX3WaPVa6LlN0pOSftrKvUr6paRnJT0lqSdrLfczkMefKuleSb/In9vPtWKvkj6Z/57l29uSvjrqvUbESX+j9DHkLwHnAR3A08D5Y9zTxcBc4LlC7Y+BFbm8AvheLl8B3E/pm/zmA1tGsc9zgLm5fBrwInB+i/Yq4NRcHg9syR7uAZZk/c+AG3L5S8Cf5fIS4O4x+Dn498BfAT/N9ZbsFfglcGZVreV+BvL4a4F/ncsdwNRW7bXQcxvwGvCbo93rqD/ZVrwBnwM2FtZvAm5qgb5mVYXEC8A5uXwO8EIu/zlwXb1xY9DzfcClrd4rMBl4gtJ3pr8BtFf/LFD6HpPP5XJ7jtMo9tgFbAYuAX6a//lbtdd6IdFyPwPAFODl6n+bVuy1qr+FwP8bi1493VQyA9hZWO/LWqs5OyJeBcj7s7LeEv3nFMdnKP2F3pK95vTNU8BuYBOlM8i3IuJQnX4Ges3t+4AzRqtX4PvA14APc/0MWrfXAH4m6XFJy7PWij8D5wH9wF/mNN4dkk5p0V6LlgB35fKo9uqQKFGd2ol0bfCY9y/pVOBvgK9GxNuDDa1TG7VeI+JwRPw2pb/S5wG/NUg/Y9arpCuB3RHxeLE8SD9j/TPw+YiYC1wO3Cjp4kHGjmWv7ZSmcW+PiM8A+ylN2TQy1v+u5OtOVwF/PdTQOrUR9+qQKOkDZhbWu4BdY9TLYF6XdA5A3u/O+pj2L2k8pYD4cUT8pJV7LYuIt4CHKM3dTpVU/pbGYj8Dveb204E9o9Ti54GrJP0SWEdpyun7LdorEbEr73cDf0spgFvxZ6AP6IuILbl+L6XQaMVeyy4HnoiI13N9VHt1SJQ8BszJK0c6KJ3arR/jnupZDyzN5aWU5v/L9evz6ob5wL7y6WizSRKwGtgWEX/a4r12Spqay5OA3wO2AQ8C1zTotfwcrgEeiJzsbbaIuCkiuiJiFqWfxwci4out2KukUySdVl6mNH/+HC34MxARrwE7JX0ySwuA51ux14LrqEw1lXsavV5H+wWYVr1RujLgRUpz1N9ogX7uAl4FPqD0F8IySnPMm4HteT89xwq4LXt/FugexT7/GaVT2meAp/J2RYv2+mngyez1OeCbWT8PeBTopXRKPyHrE3O9N7efN0Y/C1+gcnVTy/WaPT2dt63l/z+t+DOQx/9toCd/Dv4OmNbCvU4G3gROL9RGtVd/LIeZmTXk6SYzM2vIIWFmZg05JMzMrCGHhJmZNeSQMDOzhhwSZmbWkEPCzMwa+v/marPw9m1Q9wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(df_user['location'].unique())),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      "user_id     278858 non-null int64\n",
      "location    278858 non-null object\n",
      "age         168096 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info() # 110762+ 168096 = 278858 ,110762个空age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()] \n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "24.0    5687\n",
       "25.0    5618\n",
       "26.0    5547\n",
       "23.0    5456\n",
       "27.0    5383\n",
       "Name: age, dtype: int64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# age排序\n",
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts()\n",
    "age_value_counts_sort_by_age.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0    416\n",
       "1.0    288\n",
       "2.0    105\n",
       "3.0     45\n",
       "4.0     28\n",
       "Name: age, dtype: int64"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()\n",
    "age_value_counts_sort_by_age.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian'],\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    ")\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 分析打分表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149780 non-null int64\n",
      "item_id    1149780 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 删除有误的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1149774</td>\n",
       "      <td>276704</td>\n",
       "      <td>0876044011</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1149775</td>\n",
       "      <td>276704</td>\n",
       "      <td>1563526298</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1149776</td>\n",
       "      <td>276706</td>\n",
       "      <td>0679447156</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1149777</td>\n",
       "      <td>276709</td>\n",
       "      <td>0515107662</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1149778</td>\n",
       "      <td>276721</td>\n",
       "      <td>0590442449</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1149771 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         user_id     item_id  rating\n",
       "0         276725  034545104X     0.0\n",
       "1         276726  0155061224     5.0\n",
       "2         276727  0446520802     0.0\n",
       "3         276729  052165615X     3.0\n",
       "4         276729  0521795028     6.0\n",
       "...          ...         ...     ...\n",
       "1149774   276704  0876044011     0.0\n",
       "1149775   276704  1563526298     9.0\n",
       "1149776   276706  0679447156     0.0\n",
       "1149777   276709  0515107662    10.0\n",
       "1149778   276721  0590442449    10.0\n",
       "\n",
       "[1149771 rows x 3 columns]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head(-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11676     13601\n",
       "198711     7550\n",
       "153662     6109\n",
       "98391      5891\n",
       "35859      5850\n",
       "          ...  \n",
       "158698        1\n",
       "17920         1\n",
       "277135        1\n",
       "275086        1\n",
       "187812        1\n",
       "Name: user_id, Length: 105282, dtype: int64"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()\n",
    "user_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 商品流行度分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null int32\n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 评分评价度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     716108\n",
       "8     103733\n",
       "10     78609\n",
       "7      76456\n",
       "9      67541\n",
       "5      50974\n",
       "6      36923\n",
       "4       8904\n",
       "3       5995\n",
       "2       2759\n",
       "1       1770\n",
       "Name: rating, dtype: int64"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rating_value_counts = df_rating['rating'].value_counts()\n",
    "rating_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(\n",
    "    rating_value_counts.sort_index().index,\n",
    "    rating_value_counts.sort_index()\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int64\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 48.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int32\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n",
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle\n",
    "# 保存\n",
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")\n",
    "# 读取\n",
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")\n",
    "object1.head()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
